package utfpr.ct.dainf.engcomp.logica;

import utfpr.ct.dainf.engcomp.bean.Cromossomo;
import utfpr.ct.dainf.engcomp.bean.Gene;

public class FitnessFunction {
	
	private int[] valor;
	private int[] peso;
	private Cromossomo melhorCromossomo;
	private double melhorFitness = 0;
	private int geracao;
	
	public FitnessFunction(int[] valor, int[] peso){
		this.valor = valor;
		this.peso = peso;
	}
	
	public double getFitness(Cromossomo cromossomo, int geracao){
		double pesoTotal = 0;
		double valorTotal = 0;
		int index = 0;
		double retorno = 0;
		for(Gene gene : cromossomo.getGenes()){
			if( (Integer)gene.getAlelo() == 1){
				pesoTotal += peso[index];
				valorTotal += valor[index];
				if( pesoTotal > Ambiente.MAX_PESO ) return 1;
			}
			index++;
		}
		retorno = (valorTotal + Ambiente.MAX_PESO/pesoTotal);
		cromossomo.setFitness(retorno);
		if( retorno > melhorFitness ){
			melhorFitness = retorno;
			this.geracao = geracao;
			this.melhorCromossomo = new Cromossomo(cromossomo.getGeneSize());
			for( int i=0; i<cromossomo.getGeneSize(); i++)
				this.melhorCromossomo.setGeneAt(i, cromossomo.getGeneAt(i));
		}
		return retorno;
	}
	
	public int getValor(){
		int soma = 0;
		for(int i=0; i<melhorCromossomo.getGeneSize(); i++){
			if( (Integer)melhorCromossomo.getGeneAt(i).getAlelo() == 1 ){
				soma += valor[i];
			}
		}
		return soma;
	}
	
	public int getPeso(){
		int soma = 0;
		for(int i=0; i<melhorCromossomo.getGeneSize(); i++){
			if( (Integer)melhorCromossomo.getGeneAt(i).getAlelo() == 1 ){
				soma += peso[i];
			}
		}
		return soma;
	}
	
	public String melhorCromossomo(){
		String retorno = "";
		for(int i=0; i<melhorCromossomo.getGeneSize(); i++){
			retorno += melhorCromossomo.getGeneAt(i).getAlelo();
		}
		return retorno;
	}

	public int getGeracao() {
		return geracao;
	}

	public void setGeracao(int geracao) {
		this.geracao = geracao;
	}

	public double getMelhorFitness() {
		return melhorFitness;
	}
	
	
}
